﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel;

namespace DealKhuyenMaiV2.com.Models
{
    [Bind(Exclude = "IDProduct")]
    [MetadataType(typeof(Product_Validation))]
    public partial class Product
    {

    }

    public class Product_Validation
    {
     
        //[DisplayName("Tên sản phẩm")]
        [DisplayName("Tên sản phẩm")]
        [Required(ErrorMessage = "Tên sản phẩm bắt buộc")]
        [StringLength(50, ErrorMessage = "Tên sản phẩm không được dài quá 50 kí tự ")]
        public string NameProduct { get; set; }

        [DisplayName("Giá sản phẩm")]
        [Required(ErrorMessage = "Giá sản phẩm bắt buộc")]
        //1000 - > 100 triệu
        [Range(0.0, 100000.0,
           ErrorMessage = "Giá sản phẩm trong khoảng 1000 VND và 10000000 VND")]
        //[Price(ErrorMessage = "Giá sản phẩm phải là bội của 1000 VNĐ")]
        [PriceGreaterThanAttribute("Discount")]
        public decimal Price { get; set; }

        [DisplayName("Số tiền giảm giá")]
        [Required(ErrorMessage = "Số tiền giảm giá bắt buộc")]
        //1000 - > 100 triệu
        [Range(0.0, 100000.0,
           ErrorMessage = "Giá khuyến mãi trong khoảng 1000 VND và 10000000 VND")]
        //[Price(ErrorMessage = "Giá khuyến mãi phải là bội của 1000 VNĐ")]
        public decimal Discount { get; set; }

        [DisplayName("Ngày bắt đầu")]
        [Required(ErrorMessage = "Ngày bắt đầu bắt buộc")]
        //[DateStart(ErrorMessage = "Ngày bắt đầu phải sau ngày hiện tại")]
        public DateTime Date_start { get; set; }

        [DisplayName("Ngày kết thúc")]
        [Required(ErrorMessage = "Ngày kết thúc bắt buộc")]
        //[DateEnd(DateStartProperty="StartDate",ErrorMessage = "Ngày kết thúc phải sau ngày bắt đầu")]
        [DateGreaterThanAttribute("Date_start")]
        public DateTime Date_end { get; set; }

        [HiddenInput(DisplayValue = false)]
        [Required]
        public int IDAccount { get; set; }

        [DisplayName("Mô tả sản phẩm")]
       
        [AllowHtml]
        public string Description { get; set; }


        [DisplayName("Điều kiện mua sản phẩm")]
       
        [AllowHtml]
        public string Condition { get; set; }


       
        [AllowHtml]
        public string Summary { get; set; }

        // không bắt buộc
        [DisplayName("Phí vận chuyển")]
        public int Shipping { get; set; }

        [DisplayName("Trạng thái sản phẩm")]
        [Required(ErrorMessage = "Trạng thái sản phẩm bắt buộc")]
        public int IDStatus { get; set; }

        //[HiddenInput(DisplayValue = false)]
        [DisplayName("Ngày thêm vào")]
        [Required(ErrorMessage = "Ngày thêm vào bắt buộc")]
        //[DateStart(ErrorMessage = "Ngày thêm vào phải sau ngày hiện tại")]
        public DateTime DateAdded { get; set; }

        //không bắt buộc
        [DisplayName("Loại sản phẩm")]
        public int IDCatalogy { get; set; }

        [DisplayName("Thứ tự sắp xếp")]
        public int SortOrder { get; set; }

        [DisplayName("Tổng số lượng sản phẩm")]
        [Required(ErrorMessage = "Số lượng sản phẩm bắt buộc")]
        public int TotalOfNumber { get; set; }

        [DisplayName("Số lượng đặt hàng bắt đầu")]
        [Required(ErrorMessage = "Số lượng đặt hàng bắt buộc")]
        public int NumberOfPurchased { get; set; } 

        [DisplayName("Số lượng cho phép được mua")]
        [NumberSmallerThanAttribute("TotalOfNumber")]
        public int AllowableNumber { get; set; }

        [DisplayName("Mã Vùng")]
        public int IDProvince { get; set; }
    }

    public class DateStartAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            DateTime dateStart = (DateTime)value;
            if (dateStart >= DateTime.Now)
                return true;
            return false;
        }
    }

    public class PriceAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            decimal price = (Decimal)value;

            decimal result = price - Decimal.Round(Decimal.Divide(price, (Decimal)1000)) * (Decimal)1000;


            if (result == Decimal.Zero)
                return true;
            return false;
        }
    }

    public sealed class DateEndAttribute : ValidationAttribute
    {
        public string DateStartProperty { get; set; }
        public override bool IsValid(object value)
        {
            // Get Value of the DateStart property
            string dateStartString = HttpContext.Current.Request[DateStartProperty];
            DateTime dateStart = DateTime.Parse(dateStartString);

            DateTime dateEnd = (DateTime)value;
            return dateStart < dateEnd;
        }
    }

    public sealed class DateGreaterThanAttribute : ValidationAttribute
    {
        private const string _defaultErrorMessage = "'{0}' phải lớn hơn '{1}'";
        private string _basePropertyName;

        public DateGreaterThanAttribute(string basePropertyName)
            : base(_defaultErrorMessage)
        {
            _basePropertyName = basePropertyName;
        }

        //Override default FormatErrorMessage Method  
        public override string FormatErrorMessage(string name)
        {
            if (_basePropertyName == "Date_start")
            {
                return string.Format(_defaultErrorMessage, name, "Ngày bắt đầu");
            }
            return string.Format(_defaultErrorMessage, name, _basePropertyName);
        }

        //Override IsValid  
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            //Get PropertyInfo Object  
            var basePropertyInfo = validationContext.ObjectType.GetProperty(_basePropertyName);

            //Get Value of the property  
            var startDate = (DateTime)basePropertyInfo.GetValue(validationContext.ObjectInstance, null);


            var thisDate = (DateTime)value;

            //Actual comparision  
            if (thisDate < startDate)
            {
                var message = FormatErrorMessage(validationContext.DisplayName);
                return new ValidationResult(message);
            }

            //Default return - This means there were no validation error  
            return null;
        }

    }

    public sealed class PriceGreaterThanAttribute : ValidationAttribute
    {
        private const string _defaultErrorMessage = "'{0}' phải lớn hơn '{1}'";
        private string _basePropertyName;

        public PriceGreaterThanAttribute(string basePropertyName)
            : base(_defaultErrorMessage)
        {

            _basePropertyName = basePropertyName;
        }

        //Override default FormatErrorMessage Method  
        public override string FormatErrorMessage(string name)
        {
            if (_basePropertyName == "Discount")
            {
                return string.Format(_defaultErrorMessage, name, "Giá khuyến mãi");
            }
            return string.Format(_defaultErrorMessage, name, _basePropertyName);
        }

        //Override IsValid  
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            //Get PropertyInfo Object  
            var basePropertyInfo = validationContext.ObjectType.GetProperty(_basePropertyName);

            //Get Value of the property  
            var Discount = (Decimal)basePropertyInfo.GetValue(validationContext.ObjectInstance, null);


            var Price = (Decimal)value;

            //Actual comparision  
            if (Price < Discount)
            {
                var message = FormatErrorMessage(validationContext.DisplayName);
                return new ValidationResult(message);
            }

            //Default return - This means there were no validation error  
            return null;
        }

    }

    public sealed class NumberSmallerThanAttribute : ValidationAttribute
    {
        private const string _defaultErrorMessage = "'{0}' phải nhỏ hơn '{1}'";
        private string _basePropertyName;

        public NumberSmallerThanAttribute(string basePropertyName)
            : base(_defaultErrorMessage)
        {

            _basePropertyName = basePropertyName;
        }

        //Override default FormatErrorMessage Method  
        public override string FormatErrorMessage(string name)
        {
            if (_basePropertyName == "TotalOfNumber")
            {
                return string.Format(_defaultErrorMessage, name, "Tổng số lượng sản phấm");
            }
            return string.Format(_defaultErrorMessage, name, _basePropertyName);
        }

        //Override IsValid  
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            //Get PropertyInfo Object  
            var basePropertyInfo = validationContext.ObjectType.GetProperty(_basePropertyName);

            //Get Value of the property  
            var TotalOfNumber = (int)basePropertyInfo.GetValue(validationContext.ObjectInstance, null);

            if (value != null)
            {
                var AllowableNumber = (int)value;



                //Actual comparision  
                if (AllowableNumber > TotalOfNumber)
                {
                    var message = FormatErrorMessage(validationContext.DisplayName);
                    return new ValidationResult(message);
                }
            }
            //Default return - This means there were no validation error  
            return null;
        }

    }
}